package com.genericity.demo02;

import java.util.ArrayList;
import java.util.Random;

/**
 * 抽奖模型
 * 公司抽奖可以奖品也可以抽取现金
 * @param <T>
 */
public class GetProducts<T> {
    // 随机数
    static Random random = new Random();
    // 抽中的奖品
    private T product;
    // 奖品集合
    ArrayList<T> productList= new ArrayList<>();

    // 添加奖品
    public void setProduct(T product) {
        this.productList.add(product);
    }

    /**
     * 获取奖品
     * 成员方法 -- 但不是泛型方法
     * @return
     */
    public T getProduct() {
        this.product = this.productList.get(random.nextInt(productList.size()));
        return product;
    }

    /**
     * 泛型方法
     * 在所有的奖品中，随机抽取一个奖品
     * @param list 奖品列表
     * @param <E> 传入的数据参数类型 也可以定义为 T 类型，E和T都是一样的
     * @return
     */
    public <E> E getProduct(ArrayList<E> list) {
        // 返回随机礼物
        return list.get(random.nextInt(list.size()));
    }

    /**
     * 泛型方法可以定义为静态方法
     * @param list
     * @param <E> 使用时指定的具体数据类型
     * @return
     */
    public static <E> E  randomProduct(ArrayList<E> list) {
        return list.get(random.nextInt(list.size()));
    }

    /**
     * 定义多个泛型的静态方法
     * @param t
     * @param e
     * @param k
     * @param <T>
     * @param <E>
     * @param <K>
     */
    public static <T,E,K> void  go(T t,E e,K k) {
        System.out.println(t+"\t"+t.getClass().getSimpleName());
        System.out.println(e+"\t"+e.getClass().getSimpleName());
        System.out.println(k+"\t"+k.getClass().getSimpleName());
    }

    /**
     * 泛型可变参数方法
     * @param e
     * @param <E> 使用时候指定的具体数据类型
     */
    public <E> void print(E... e) {
        //System.out.println(e.toString());
        for (E e1 : e) {
            System.out.println(e1);
        }
    }
}
